// File: jmcomic-core/src/main/java/dev/jukomu/common/postman/proxy/WrapRespPostman.java
package dev.jukomu.common.postman.proxy;

import dev.jukomu.common.postman.Postman;
import dev.jukomu.common.util.net.CommonResponse;
import dev.jukomu.common.util.net.IResponse;

import java.util.Map;

/**
 * 对应Python的WrapRespPostman，一个Postman代理，用于包装响应对象。
 */
public class WrapRespPostman extends PostmanProxy {

    private final Class<? extends IResponse> wrapRespClass; // 响应包装类

    /**
     * 构造函数。
     *
     * @param postman       被代理的Postman实例。
     * @param wrapRespClass 响应包装类，如果为null则使用CommonResponse。
     */
    public WrapRespPostman(Postman postman, Class<? extends IResponse> wrapRespClass) {
        super(postman);
        this.wrapRespClass = (wrapRespClass != null) ? wrapRespClass : CommonResponse.class;
    }

    @Override
    public IResponse get(String url, Map<String, Object> kwargs) throws Exception {
        IResponse rawResp = super.get(url, kwargs);
        return wrapResponse(rawResp);
    }

    @Override
    public IResponse post(String url, Map<String, Object> kwargs) throws Exception {
        IResponse rawResp = super.post(url, kwargs);
        return wrapResponse(rawResp);
    }

    @Override
    public Postman copy() {
        return new WrapRespPostman(postman.copy(), wrapRespClass);
    }

    /**
     * 使用指定的响应包装类包装原始响应。
     *
     * @param rawResp 原始响应对象
     * @return 包装后的响应对象
     * @throws Exception 如果包装失败（例如反射实例化问题）
     */
    protected IResponse wrapResponse(IResponse rawResp) throws Exception {
        try {
            // 假设包装类有一个接受IResponse作为参数的构造函数
            return wrapRespClass.getConstructor(rawResp.getClass()).newInstance(rawResp);
        } catch (NoSuchMethodException e) {
            // 如果没有接受IResponse的构造函数，尝试接受原始OkHttp Response的构造函数
            // 假设rawResp.getRawResponse()返回的是okhttp3.Response
            return wrapRespClass.getConstructor(rawResp.getRawResponse().getClass()).newInstance(rawResp.getRawResponse());
        } catch (Exception e) {
            throw new Exception("Failed to wrap response with " + wrapRespClass.getName(), e);
        }
    }
}